const fs = require('fs');
var http = require('http');
var equal = require('assert').equal;
const iconv = require('iconv-lite');
const url = require("url")
var colors = require( "colors")
var username = 'falcon';
var password = '';
var _auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64')
const  isJson = function(str) {  
    try {  
        JSON.parse(str);  
    } catch (e) {  
        return false;  
    }  
    return true;  
} 

function getRemoteData(options, cb) {
  var req = http.request(options, function(res) {
    //equal(200, res.statusCode);
    let resHeaders = res.headers
    let data = ''
    res.on('data', function(chunk) {
      data += chunk
    });
    //console.log(res.headers)

    res.on('end', function() {
      !isJson(data) && console.log('rest server res: ', '[not Json]\n'.red, data.substring( 0, 100), data.length > 100 ? '... |||| data.length =' + data.length:'')

      if (data.indexOf("({") > -1 && !isJson(data) ) {
        data = data.substring( data.indexOf("({") + 1 )
        data = data.substring( 0, data.length-1 )
      }
      isJson(data) && console.log('rest server res: ', res.statusCode,  data.substring( 0, 100), data.length > 100 ? '... |||| data.length =' + data.length:'');
      (res.statusCode === 200 || res.statusCode === 302) && isJson(data) || (data = {
        "success": "false",
        "code": "-1"
      })
      isJson(data) && (data = JSON.parse(data))
      data.ssrsc = res.statusCode
      writeFile('./res.data.txt', new Date().toLocaleDateString() + ' ' + new Date().toLocaleTimeString() + ' ' + JSON.stringify(data) + '\r\n')
      typeof cb === 'function' && cb(JSON.stringify(data))
    })
  });
  req.write(options.data + "\n");
  req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
  });
  req.end();
}



function writeFile(file, str) {
  // 测试用的中文  
  //var str = "\r\n我是一个人Hello myself!";  
  // 把中文转换成字节数组  
  var arr = iconv.encode(str, 'utf-8');

  // appendFile，如果文件不存在，会自动创建新文件  
  // 如果用writeFile，那么会删除旧文件，直接写新文件  
  fs.appendFile(file, arr, function(err) {
    if (err)
      console.log("fail " + err);
    //else
      //console.log("写入文件ok");
  });
}

function readFile(file) {
  fs.readFile(file, function(err, data) {
    if (err)
      console.log("读取文件fail " + err);
    else {
      // 读取成功时  
      // 输出字节数组  
      console.log(data);
      // 把数组转换为gbk中文  
      var str = iconv.decode(data, 'gbk');
      console.log(str);
    }
  });
}

exports.fatch = function(args) {
  if (args.url === '/favicon.ico') return doCb(/*"{ msg:'blocked by proxy!',success: 'false', code: '-1', ssrsc: 404 }"*/)
  data = args.data
  let fatchUrl = url.parse(args.url)
  var options = {
    host: '16c88d4796.51mypc.cn',
    port: 80,
    path: fatchUrl.path /*'/TYCRM/BaseMyDiary/loadProjInDiary'*/,
    method: args.method,
    headers: {
      'accept': '*/*',
      'content-type': "application/atom+xml",
      'accept-encoding': 'gzip, deflate',
      'accept-language': 'en-US,en;q=0.9',
      'authorization': _auth,
      'user-agent': 'nodejs rest client'
    },
    data: args.data
  }
  console.log('fatching '+'['+options.method+']'+options.host+':'+options.port+args.url)
  getRemoteData(options, function(data) {
    doCb(data)
  })

  function doCb(data) {
    typeof args.succ === 'function' && args.succ(data)
  }
}

/*
 *  url.parse( urlString, boolean, boolean )
 *　parse这个方法可以将一个url的字符串解析并返回一个url的对象
 *　参数：urlString指传入一个url地址的字符串
 *　第二个参数（可省）传入一个布尔值，默认为false，为true时，返回的url对象中，query的属性为一个对象。
 *　第三个参数（可省）传入一个布尔值，默认为false，为true时，额，我也不知道有什么不同，可以去看看API。
 *  返回值：
 *  {
 *    protocol: 'http:',
 *    slashes: true,
 *    auth: 'user:pass',
 *    host: 'host.com:8080',
 *    port: '8080',
 *    hostname: 'host.com',
 *    hash: '#hash',
 *    search: '?query=string',
 *    query: 'query=string',
 *    pathname: '/p/a/t/h',
 *    path: '/p/a/t/h?query=string',
 *    href: 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'
 *   }
 *  没有设置第二个参数为true时，query属性为一个字符串类型
 */